.NET 如何将 DataTable 转成 IEnumerable<T> ?
The following article is from NET技术问答 Author StackOverflow
咨询区
我想将一个外域系统中传过来的 DataTable
转成 IEnumerable
,下面的代码在 ASP.NET 4.6.1
中是没有问题的。
public static IEnumerable<UserAssignmentDto> StaffAssignmentsUsingStoredProcedure(System.Data.DataTable dataTable)
{
var data = dataTable.AsEnumerable().Select(row =>
new UserAssignmentDto
{
Id = ((string)row["AssignmentNumber"]),
Position = (string) row["EsrPositionTitle"],
});
return data;
}
但是 ASP.NET Core
中 DataTable 的扩展方法 AsEnumerable
已经被拿掉了,这就很尴尬了,请问现在我还有什么高效的方式将 DataTable
转成我需要的 IEnumerable
呢?
回答区
在 ASP.NET Core
中你只能自己通过 for 循环迭代,因为在 .NET Core
中并没有实现 IEnumerable
接口,所以你使用不了 Linq 和 Foreach, 可参考如下代码:
public static IEnumerable<UserAssignmentDto> StaffAssignmentsUsingStoredProcedure(System.Data.DataTable dataTable)
{
var retList = new List<UserAssignmentDto>();
for(int i = 0; i < dataTable.Rows.Count; i++)
{
var row = dataTable.Rows[i];
var temp = new UserAssignmentDto(){
Id = row["AssignmentNumber"],
Position = row["EsrPositionTitle"]
};
retList.Add(temp);
}
return retList;
}
并没有比 for 更高效的处理方式,当然你可以使用原生的 Select
进行过滤。
DataRow[] rows= dataTable.Select();
我还封装了一个扩展方法,或许能够帮到你。
public static List<T> ConvertDataTableToGenericList<T>(DataTable dt)
{
var columnNames = dt.Columns.Cast<DataColumn>()
.Select(c => c.ColumnName)
.ToList();
var properties = typeof(T).GetProperties();
DataRow[] rows= dt.Select();
return rows.Select(row =>
{
var objT = Activator.CreateInstance<T>();
foreach (var pro in properties)
{
if (columnNames.Contains(pro.Name))
pro.SetValue(objT, row[pro.Name]);
}
return objT;
}).ToList();
}
点评区
虽然 .NET Core
对 DataTable 已经很不友好了,但实际场景下总有这样的需求,使用上面提供的扩展方法挺好的,学习了。
- EOF -
看完本文有收获?请转发分享给更多人
推荐关注「DotNet」,提升.Net技能
点赞和在看就是最大的支持❤️